package controllers

import (
	"crmObject/models"
	"crmObject/util"
	"encoding/json"
	"fmt"
	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
	"github.com/gomodule/redigo/redis"
	"golang.org/x/crypto/bcrypt"
	"strconv"
)

type AdminController struct {
	beego.Controller
}

var user models.Users
var usersArray []models.Users

//进入管理员主界面

func (c *AdminController) ToIndex() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	conn := util.RedisPool.Get()
	// 从 Redis 中读取 JSON 字符串
	userJSON, err := redis.String(conn.Do("GET", util.USERS))
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	// 将 JSON 字符串反序列化为结构体
	err = json.Unmarshal([]byte(userJSON), &user)
	//defer conn.Close()
	c.Data["user"] = user
	defer conn.Close()
	c.TplName = "adminIndexTables.html"
}

//分页展示用户数据

func (c *AdminController) ListUser() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	//当前页
	pageNoStr := c.GetString("pageNo")
	if pageNoStr == "" {
		pageNoStr = "1"
	}
	pageNo, err := strconv.Atoi(pageNoStr)
	newOrm := orm.NewOrm()
	//总记录数
	totalPageCount, err := newOrm.QueryTable(&user).Count()
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	pagination := util.NewPagination(int(totalPageCount), pageNo, util.PAGESIZE)
	_, err = newOrm.QueryTable("users").RelatedSel().Limit(util.PAGESIZE, (pageNo-1)*util.PAGESIZE).All(&usersArray)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["error"] = newError
		c.TplName = "error.html"
	}
	c.Data["users"] = usersArray
	c.Data["page"] = pagination
	conn := util.RedisPool.Get()
	// 从 Redis 中读取 JSON 字符串
	userJSON, err := redis.String(conn.Do("GET", util.USERS))
	if err != nil {
		fmt.Println(err)
	}
	// 将 JSON 字符串反序列化为结构体
	err = json.Unmarshal([]byte(userJSON), &user)
	//defer conn.Close()
	c.Data["user"] = user
	defer conn.Close()
	c.TplName = "adminUserTables.html"
}

//添加账户

func (c *AdminController) AddUser() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &user)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	//判断账户和密码不能为空
	if user.Username == "" || user.Password == "" {
		errCode := 506
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	//用户名唯一
	newOrm := orm.NewOrm()
	count, err := newOrm.QueryTable(&user).Filter("username", user.Username).Count()
	if err != nil {
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	if count >= 1 {
		errCode := 507
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	//hash加密
	passwordHash, err := bcrypt.GenerateFromPassword([]byte(user.Password), bcrypt.DefaultCost)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	user.Password = string(passwordHash)
	fmt.Println("加密的后的密码", user.Password)
	user.UserID = 0
	_, err = newOrm.Insert(&user)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}

//删除账户

func (c *AdminController) DeleteUser() {
	// 在进入每个页面之前进行登录状态的判断
	if !IsUserLoggedIn() {
		c.Redirect("/login", 302) // 未登录则重定向到登录页面
	}
	err := json.Unmarshal(c.Ctx.Input.RequestBody, &user)
	if err != nil {
		fmt.Println(err)
		errCode := 504
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	newOrm := orm.NewOrm()
	//delete不需要外键会直接删除
	_, err = newOrm.Delete(&user)
	if err != nil {
		fmt.Println(err)
		errCode := 500
		newError := util.NewError(errCode)
		c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
		c.ServeJSON()
		return
	}
	errCode := 200
	newError := util.NewError(errCode)
	c.Data["json"] = LoginResponse{Code: newError.Code, Message: newError.Message}
	c.ServeJSON()
}
